﻿using Newtonsoft.Json;
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ttifa.Log;

namespace Ttifa.CronScheduler
{
    public class QuartzDemo
    {
        IScheduler scheduler = null;

        public void Start()
        {
            Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info };

            scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();

            // define the job and tie it to our HelloJob class
            //IJobDetail job = JobBuilder.Create<HelloJob>()
            //    .WithIdentity("job1", "group1")
            //    .Build();

            IJobDetail job2 = new JobDetailImpl("hello", typeof(HelloJob));
            job2.JobDataMap.Add("Api", "/Home/Index");

            // Trigger the job to run now, and then repeat every 10 seconds
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")
                .StartNow()
                .WithSimpleSchedule(x => x /*10s执行一次*/
                    .WithIntervalInSeconds(10)
                    .RepeatForever())
                .Build();

            //Cron Trigger 
            /*
             *  Cron Expressions： Seconds Minutes Hours Day-of-Month Month Day-of-Week Year(optional field)
                "-" ：表示范围  MON-WED表示星期一到星期三
                "," ：表示列举 MON,WEB表示星期一和星期三
                "*" ：表是“每”，每月，每天，每周，每年等
                "/" :表示增量：0/15（处于分钟段里面） 每15分钟，在0分以后开始，3/20 每20分钟，从3分钟以后开始
                "?" :只能出现在日，星期段里面，表示不指定具体的值
                "L" :只能出现在日，星期段里面，是Last的缩写，一个月的最后一天，一个星期的最后一天（星期六）
                "W" :表示工作日，距离给定值最近的工作日
                "#" :表示一个月的第几个星期几，例如："6#3"表示每个月的第三个星期五（1=SUN...6=FRI,7=SAT）
             */
            //var cronTrigger = TriggerBuilder.Create()
            //    .WithIdentity("trigger2", "group1")
            //    .WithCronSchedule("0 42 10 * * ?")  //daily at 10:42 am
            //    .ForJob("myJob", "group1")
            //    .Build();
            //检查Cron表达式
            //Quartz.CronExpression.IsValidExpression("0 42 10 * * ?");

            // Tell quartz to schedule the job using our trigger
            scheduler.ScheduleJob(job2, trigger);
        }

        public void Stop()
        {
            scheduler.Shutdown();
        }

        public void Pause()
        {
            scheduler.PauseAll();
        }

        public void Continue()
        {
            scheduler.ResumeAll();
        }
    }

    public class HelloJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var data = context.JobDetail.JobDataMap;
            LogFactory.GetLogger().Info($"Params: {data["Api"]}!");
        }
    }
}
